package com.zll.feign;

import com.zll.domain.User;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * openfeign原理
 * 1.@EnableFeignClients：此注解有两个功能
 *      1.代表开启feign功能
 *      2.它会自动扫描加了该注解的类的同级目录及以下所有项目中加了@FeignClient注解的所有接口
 *      找到feign接口之后，他会使用动态代理帮助我们创建实现类，并且交给spring管理
 *      3.在代理类的方法体中，他会拿到@FeignClient中我们写的服务名称+我们在接口方法上面写的接口路径
 *      再拿到我们调用方法时传递过来的参数，在拿到方法返回值，拼接成 "http://localhost:10220/getUserById/"+id;
 *      进行Http接口调用
 *
 */
// 表示该接口是一个feign接口，我们需要指定被调用方的服务名称
@FeignClient(name = "user-service",fallbackFactory = UserServiceFallbackFactory.class) // 服务名称
@RequestMapping("/user") // 公共接口
public interface UserService {

    /*
        1.feign接口方法定义规范：feign接口方法直接去cv目标接口，删除方法体即可
           1.方法名称必须跟接口的方法名称一致
           2.方法参数必须跟接口方法参数一致
           3.方法返回值必须跟接口的方法返回值一致
           4.请求路径必须跟接口的请求路径一致
     */

    @GetMapping("/getUserById/{id}")
    User getUserById(@PathVariable("id")Long id);

}
